module Drzewo (Nazwa, Wyrażenie(..), Typ(..), OpisaneWyrażenie(..)) where

type Nazwa = String

data Wyrażenie = Funkcja Nazwa Wyrażenie
               | Wywołanie Wyrażenie Wyrażenie
               | Zmienna Nazwa
               deriving (Eq, Show, Read)

data Typ = TZmiennej Nazwa
         | Strzałka Typ Typ
         deriving (Eq)
instance Show Typ where
  show (TZmiennej x) = '\'':x
  show (Strzałka s@(Strzałka _ _) t) = "("++(show s)++") -> "++(show t)
  show (Strzałka x y) = (show x)++" -> "++(show y)

data OpisaneWyrażenie = OFunkcja Nazwa OpisaneWyrażenie Typ
                      | OWywołanie OpisaneWyrażenie OpisaneWyrażenie Typ
                      | OZmienna Nazwa Typ
                      deriving (Eq, Show)
